/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejercicio.practica7;

import static java.lang.Math.sin;
import java.util.Scanner;

/**
 *
 * @author manolo
 */
public class intParalelomultiCont implements Runnable {

    private int aciertos = 0;
    private int umbral;
    private static int numHilos;
    static long cuenta = 0;

    public intParalelomultiCont(int umbral) {
        this.umbral = umbral;
    }

    public synchronized void incrementar(int parcial) {
        this.cuenta += parcial;
    }

    @Override
    public void run() {
        for (int i = 0; i < umbral; i++) {
            double xCoord = Math.random();
            double yCoord = Math.random();
            if (yCoord < sin(xCoord)) {
                aciertos++;
            }
            incrementar(aciertos);
        }
    }

    public static void main(String[] args) {
        int lanzados = 0;
        float seno = 0;
        int numProcesadores = Runtime.getRuntime().availableProcessors();
        double Cb = 0.5;
        numHilos = (int) (numProcesadores / (1 - Cb));
        double inicio, fin;
        Scanner teclado = new Scanner(System.in);

        System.out.println("Estimación de la integral definida de sen(X) usando el método Montecarlo en el intervalo [0,1]: ");
        System.out.println("Inserte el numero de puntos: ");
        lanzados = teclado.nextInt();
        int umbral = lanzados / numHilos;

        Thread[] hilos = new Thread[numHilos];
        inicio = System.nanoTime();
        for (int i = 0; i < numHilos; i++) {
            hilos[i] = new Thread(new intParalelomultiCont(umbral));
            hilos[i].start();
        }
        fin = System.nanoTime();
        seno = ((float) intParalelomultiCont.cuenta / lanzados);

        System.out.println("La estimación es: " + seno);
        System.out.println("Operación realizada en " + (fin - inicio) / 1E6 + " mseg.");

    }
}
